/* 
1 点击按钮 获取用户的收货地址 
  1 获取 用户 关于 收货地址的  权限状态  
  2 假如 收货地址的权限 =  true  直接获取收货地址 wx-chooseAddress 即可 
  3 假如 用户 没有给 收货地址的权限
      1 第一次打开页面   scope 为 undefined
      2 用户拒绝过 给权限   scope 为false 

  4 代码如何写
    1 获取 用户 关于 收货地址的  权限状态   scope
    2 scope 可能true 可能 false  可能是 undefined
    3 当 scope =  true 直接 获取  用户收货信息就可以了  wx-chooseAddress
    4 当 scope = undefined  直接 获取  用户收货信息就可以了  wx-chooseAddress
    5 当 scope = false  才需要诱导 用户 打开 设置界面 给与 权限 再 去或者  wx-chooseAddress
  5 获取收货地址的代码  不能用 promise或者 async的方式来优化
    1 微信小程序 看到 promise或者 async的代码的时候 会认为 这些代码经过了封装，就不是用户自己的点击的行为 因此小程序会报错
      user TGP   
 */
Page({
  data: {
    address: null,
    cart: {},
    // 全选状态
    isAllChecked: false,
    // 总价
    totalPrice: 0,
    // 要购买的种类的数量
    nums: 0
  },

  /* 页面重新显示 执行 */
  onShow() {

    // 地址
    let address = wx.getStorageSync("address") || {};
    // 购物车信息
    let cart = wx.getStorageSync("cart") || {};

    address.detailAddress = address.provinceName + address.cityName + address.countyName + address.detailInfo;

    let isAllChecked = Object.values(cart).every(v => v.isChecked);
    this.setData({ address, cart, isAllChecked });

    // 计算总价格
    this.accountPriceNums();
  },


  // 点击获取收货地址
  handleChooseAddress() {
    let that = this;
    wx.getSetting({
      success(res) {
        // 获取 收货地址的 权限状态
        let addressScope = res.authSetting["scope.address"];
        // 用户 给过确定的权限或者 第一次获取收货地址
        if (addressScope === undefined || addressScope === true) {
          wx.chooseAddress({
            success: (address) => {
              // 设置到本地存储中
             
              address.detailAddress = address.provinceName + address.cityName + address.countyName + address.detailInfo;
              that.setData({
                address: address
              })
              wx.setStorageSync("address", address);
            }

          });

        } else if (addressScope === false) {
          // 打开设置界面
          wx.openSetting({
            // 重新去获取 收货地址信息
            success: (result1) => {
              wx.chooseAddress({
                success: (address) => {
                
                  address.detailAddress = address.provinceName + address.cityName + address.countyName + address.detailInfo;
                  that.setData({
                    address: address
                  })
                  wx.setStorageSync("address", address);
                }
              });

            }
          });

        }

      }
    })


  },
  // 商品的复选框 值改变
  handleItemChange(e) {
    const { id } = e.currentTarget.dataset;

    // 获取购物车对象 （存放很多个商品对象）
    let cart = this.data.cart;
    // 获取 id所在的商品对象
    // isChecked取反
    cart[id].isChecked = !cart[id].isChecked;


    // 判断商品是否都选中了 forin 来判断
    // 遍历数组 every(function(){return true}) 返回的全部都是true 那么 
    // 只要有一个为false 那么 every的函数的返回值 = false
    //   true =[].every
    // 对象 转成 数组 

    //  Object.values(cart) 返回cart的值所组成一个数组


    // 把cart 设置到本地存储中 
    wx.setStorageSync("cart", cart);

    let isAllChecked = Object.values(cart).every(v => v.isChecked);

    this.setData({
      isAllChecked,
      cart
    });

    // 计算总价格
    this.accountPriceNums();

  },
  // 全选功能
  handleAllItemChange() {
    // 获取 全选状态
    let { isAllChecked, cart } = this.data;
    isAllChecked = !isAllChecked;
    // 把购物车的商品对象的 isChecked都等于  isAllChecked

    for (const key in cart) {
      // 对象上的属性 一个自己 一个原型链上的 
      // 判断当前属性是不是自己 
      if (cart.hasOwnProperty(key)) {
        // 每一个商品对象
        cart[key].isChecked = isAllChecked;
      }
    }


    // 存回去
    this.setData({
      cart,
      isAllChecked
    })

    wx.setStorageSync("cart", cart);

    // 计算总价格
    this.accountPriceNums();
  },

  // 计算总价和数量
  accountPriceNums() {
    // 1 获取cart对象
    let { cart } = this.data;
    // 总价的和 购买种类 
    let totalPrice = 0;
    let nums = 0;
    // 2 循环cart对象
    for (const key in cart) {
      if (cart.hasOwnProperty(key)) {
        //  4 判断该商品是否被选中
        if (cart[key].isChecked) {
          // 计算总价格
          totalPrice += cart[key].goods_price * cart[key].count;
          // 设置 购买的种类的数量
          nums++;
        }
      }
    }
    this.setData({
      totalPrice,
      nums
    })
  },
  // 编辑数量事件
  handleItemsEdit(e) {
    // 操作的 + 1 还是  -1  id = 商品的id
    let { operation, id } = e.currentTarget.dataset;
    // 获取cart对象
    let { cart } = this.data;
    // 编辑数量

    cart[id].count += +operation;

    // 判断数量的合法性
    if (cart[id].count == 0) {
      // 用户要删除这个商品
      // 弹出对话框
      wx.showModal({
        title: '提示',
        content: '您确定要删除吗？😄',
        showCancel: true,
        cancelText: '取消',
        cancelColor: '#000000',
        confirmText: '确定',
        confirmColor: '#3CC51F',
        success: (result) => {
          if (result.confirm) {
            // 确定  要删除
            delete cart[id];
          } else {
            // 取消 == 不删除
            // 重新把数量=1
            cart[id].count = 1;
          }
          this.setData({
            cart
          })
          wx.setStorageSync("cart", cart);
          this.accountPriceNums();
        }
      });

    } else if (cart[id].count > cart[id].goods_number) {
      // 当前购买的数量大于库存 

      // 弹出提示  把购买数量设置成库存的值
      cart[id].count = cart[id].goods_number;
      wx.showToast({
        title: '已达到购买的最大数量',
        icon: 'none',
        duration: 1500,
        mask: true
      });
      this.setData({
        cart
      });
      wx.setStorageSync("cart", cart);
      this.accountPriceNums();
    } else {
      // 满足条件的正常操作

      this.setData({
        cart
      });
      wx.setStorageSync("cart", cart);

      this.accountPriceNums();
    }



  },
  // 点击 结算按钮
  handlePay() {
    /* 
    1 判断有没有选择收货地址
    2 判断有没有选中要购买的商品
     */

    let { address, nums } = this.data;
    if (!address["detailAddress"]) {
      //  没有选择地址
      wx.showToast({
        title: '您还没有选择收货地址',
        icon: 'none',
        duration: 1500,
        mask: true
      });


    } else if (nums == 0) {
      //  用户没有选择要结算的商品 
      wx.showToast({
        title: '您还没有选购商品',
        icon: 'none',
        duration: 1500,
        mask: true
      });
    }else{
      // 验证通过
      
      // 通过代码的方式来跳转页面
      wx.navigateTo({
        url: '../pay/index'
      });
        

    }
  }
})